const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const webpack = require('webpack');


// 1) cleanWebpackPlugin
// 2) copyWebpackPlugin
// 3) bannerPlugin  内置

module.exports = {
  resolve: { // 解析 第三方包 common
    modules: [path.resolve('node_modules')], // 只查找当前目录下的 node_modules
    // alias: { // 别名
    //   bootstrap:'bootstrap/dist/css/bootstrap.css',
    // }
    mainFields: ['style', 'main'], // 先找 bootstrap 包下 package.json 中 style 找不到 找 main
    // mainFiles: [], // 入口文件的名字 index.js
    extensions: ['.js', '.css', '.json', '.vue', '.jsx'],// 省略了 style 的 .css 后缀
  },
  devServer: { // 开发服务器的配置
    port: 8080,
    progress: true,
    open: true, // 自动打开浏览器
    // 1) 使用代理将请求转发
    // proxy: { // 重写的方式 把请求代理到 express 服务器上
    //   '/api': {
    //     target: 'http://localhost:3000', // 配置了一个代理
    //     pathRewrite: {'/api': ''}, // 这样的话就会 在 转发的时候 把 api 去掉了。防止后端不是以 api  开头的情况。
    //   }
    // }
    // 2) 前端单纯来模拟数据
    before(app) { // 提供的方法，因为 webpack 内部就是一个 express
      app.get('/api/user', (req, res) => {
        res.json({name: '高泽文-before'});
      });
    }
    // 3) 有服务端 不想用代理来处理 webpack  和 后端服务 启动在 一个端口上
  },
  mode: 'development', // development production
  entry: {
    home: './src/index.js',
  },
  output: {
    filename: '[name].[hash:8].js',
    path: path.resolve(__dirname, 'dist')
  },
  // watch: true,
  // watchOptions: { // 监控的选项
  //   poll: 1000, // 每秒 轮询 1000次
  //   aggregateTimeout: 500, // 防抖 我一直输入代码, 过了 500 ms
  //   ignored: /node_modules/ // 不需要进行监控哪个文件
  // },
  plugins: [
    new HtmlWebpackPlugin({
      template: './index.html',
      filename: "index.html", // 打包后的名字
    }),
    new CleanWebpackPlugin(['./dist']),
    new CopyWebpackPlugin([ // 拷贝插件
      {from: './doc', to: './'}
    ]),
    new webpack.BannerPlugin('make 2019 by GaoZeWen'), // 版权声明
    new webpack.DefinePlugin({ // 定义 运行时环境变量
      DEV: JSON.stringify('production'),
      FLAG: 'true', // 最终结果是 bool true
      EXPRESSION: '1+1', // 最终结果是 2
    }),
  ],
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              '@babel/preset-env'
            ]
          }
        }
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  }
};
